﻿#pragma once


#include <iostream>
#include <string.h>
#include "Vec2.h"
#include "Vec3.h"
#include "Vec4.h"
#include "Quaternion.h"
#include "Matrix4x4.h"

namespace Base {

	const float kDeg2Rad = XM_PI / 180.0f;

	//---------------------------------------------
	inline float Deg2Rad(float deg) {
		return deg * kDeg2Rad;
	}

	inline float Rad2Deg(float rad) {
		return rad / kDeg2Rad;
	}

	// return [min,max) 之间的一个
	int RandomInt(int min, int max);

	// return [0,1]之间的一个随机浮点数
	float Random01();

	// return [min,max] 之间一个随机浮点数
	float RandomFloat(float min, float max);

	//-----------------------------------------------------------------
	// 封装一套返回 XMFloatN 的方法
	// 对着这些 API 转换一次
	// https://blog.csdn.net/weixin_30462049/article/details/99245818


	Vec4 operator*(const Vec4& lhs, const Matrix4x4& rhs);

	//------------------------------------
	// 全局方法,各种打印重载
	std::ostream& operator<<(std::ostream& os, const Vec2& v2);
	std::ostream& operator<<(std::ostream& os, const Vec3& v3);
	std::ostream& operator<<(std::ostream& os, const Vec4& v4);
	std::ostream& operator<<(std::ostream& os, const Quaternion& q);
	std::ostream& operator<<(std::ostream& os, const Matrix4x4& mat4x4);

	// 打印具体对象
	template<typename T>
	void Info(const T& t) {
		std::cout << t << std::endl;
	}


	//------------------------------------
	// 各种对象间的转换
	// 1. Quaternion->Matrix4x4
	Matrix4x4 QuaternionToMatrix4x4(const Quaternion& q);

	// 2. Matrix4x4->Quaternion
	Quaternion Matrix4x4ToQuaternion(const Matrix4x4& matrix);

	// 3. Quaternion->Euler
	//Vec3 QuaternionToEuler(const Quaternion& q);


	// 球坐标系->笛卡尔坐标系
	// 柱坐标系->笛卡尔坐标系
	Vec3 SphereToDecare(float r, float thetaRad, float phiRad);

}
